home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / poplib.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  9KB  |  326 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import re
  5. import socket
  6. __all__ = [
  7.     'POP3',
  8.     'error_proto',
  9.     'POP3_SSL']
  10.  
  11. class error_proto(Exception):
  12.     pass
  13.  
  14. POP3_PORT = 110
  15. POP3_SSL_PORT = 995
  16. CR = '\r'
  17. LF = '\n'
  18. CRLF = CR + LF
  19.  
  20. class POP3:
  21.     
  22.     def __init__(self, host, port = POP3_PORT):
  23.         self.host = host
  24.         self.port = port
  25.         msg = 'getaddrinfo returns an empty list'
  26.         self.sock = None
  27.         for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
  28.             (af, socktype, proto, canonname, sa) = res
  29.             
  30.             try:
  31.                 self.sock = socket.socket(af, socktype, proto)
  32.                 self.sock.connect(sa)
  33.             except socket.error:
  34.                 msg = None
  35.                 if self.sock:
  36.                     self.sock.close()
  37.                 
  38.                 self.sock = None
  39.                 continue
  40.  
  41.             break
  42.         
  43.         if not self.sock:
  44.             raise socket.error, msg
  45.         
  46.         self.file = self.sock.makefile('rb')
  47.         self._debugging = 0
  48.         self.welcome = self._getresp()
  49.  
  50.     
  51.     def _putline(self, line):
  52.         if self._debugging > 1:
  53.             print '*put*', repr(line)
  54.         
  55.         self.sock.sendall('%s%s' % (line, CRLF))
  56.  
  57.     
  58.     def _putcmd(self, line):
  59.         if self._debugging:
  60.             print '*cmd*', repr(line)
  61.         
  62.         self._putline(line)
  63.  
  64.     
  65.     def _getline(self):
  66.         line = self.file.readline()
  67.         if self._debugging > 1:
  68.             print '*get*', repr(line)
  69.         
  70.         if not line:
  71.             raise error_proto('-ERR EOF')
  72.         
  73.         octets = len(line)
  74.         if line[-2:] == CRLF:
  75.             return (line[:-2], octets)
  76.         
  77.         if line[0] == CR:
  78.             return (line[1:-1], octets)
  79.         
  80.         return (line[:-1], octets)
  81.  
  82.     
  83.     def _getresp(self):
  84.         (resp, o) = self._getline()
  85.         if self._debugging > 1:
  86.             print '*resp*', repr(resp)
  87.         
  88.         c = resp[:1]
  89.         if c != '+':
  90.             raise error_proto(resp)
  91.         
  92.         return resp
  93.  
  94.     
  95.     def _getlongresp(self):
  96.         resp = self._getresp()
  97.         list = []
  98.         octets = 0
  99.         (line, o) = self._getline()
  100.         while line != '.':
  101.             if line[:2] == '..':
  102.                 o = o - 1
  103.                 line = line[1:]
  104.             
  105.             octets = octets + o
  106.             list.append(line)
  107.             (line, o) = self._getline()
  108.         return (resp, list, octets)
  109.  
  110.     
  111.     def _shortcmd(self, line):
  112.         self._putcmd(line)
  113.         return self._getresp()
  114.  
  115.     
  116.     def _longcmd(self, line):
  117.         self._putcmd(line)
  118.         return self._getlongresp()
  119.  
  120.     
  121.     def getwelcome(self):
  122.         return self.welcome
  123.  
  124.     
  125.     def set_debuglevel(self, level):
  126.         self._debugging = level
  127.  
  128.     
  129.     def user(self, user):
  130.         return self._shortcmd('USER %s' % user)
  131.  
  132.     
  133.     def pass_(self, pswd):
  134.         return self._shortcmd('PASS %s' % pswd)
  135.  
  136.     
  137.     def stat(self):
  138.         retval = self._shortcmd('STAT')
  139.         rets = retval.split()
  140.         if self._debugging:
  141.             print '*stat*', repr(rets)
  142.         
  143.         numMessages = int(rets[1])
  144.         sizeMessages = int(rets[2])
  145.         return (numMessages, sizeMessages)
  146.  
  147.     
  148.     def list(self, which = None):
  149.         if which is not None:
  150.             return self._shortcmd('LIST %s' % which)
  151.         
  152.         return self._longcmd('LIST')
  153.  
  154.     
  155.     def retr(self, which):
  156.         return self._longcmd('RETR %s' % which)
  157.  
  158.     
  159.     def dele(self, which):
  160.         return self._shortcmd('DELE %s' % which)
  161.  
  162.     
  163.     def noop(self):
  164.         return self._shortcmd('NOOP')
  165.  
  166.     
  167.     def rset(self):
  168.         return self._shortcmd('RSET')
  169.  
  170.     
  171.     def quit(self):
  172.         
  173.         try:
  174.             resp = self._shortcmd('QUIT')
  175.         except error_proto:
  176.             val = None
  177.             resp = val
  178.  
  179.         self.file.close()
  180.         self.sock.close()
  181.         del self.file
  182.         del self.sock
  183.         return resp
  184.  
  185.     
  186.     def rpop(self, user):
  187.         return self._shortcmd('RPOP %s' % user)
  188.  
  189.     timestamp = re.compile('\\+OK.*(<[^>]+>)')
  190.     
  191.     def apop(self, user, secret):
  192.         m = self.timestamp.match(self.welcome)
  193.         if not m:
  194.             raise error_proto('-ERR APOP not supported by server')
  195.         
  196.         import hashlib as hashlib
  197.         digest = hashlib.md5(m.group(1) + secret).digest()
  198.         digest = ''.join(map((lambda x: '%02x' % ord(x)), digest))
  199.         return self._shortcmd('APOP %s %s' % (user, digest))
  200.  
  201.     
  202.     def top(self, which, howmuch):
  203.         return self._longcmd('TOP %s %s' % (which, howmuch))
  204.  
  205.     
  206.     def uidl(self, which = None):
  207.         if which is not None:
  208.             return self._shortcmd('UIDL %s' % which)
  209.         
  210.         return self._longcmd('UIDL')
  211.  
  212.  
  213.  
  214. class POP3_SSL(POP3):
  215.     
  216.     def __init__(self, host, port = POP3_SSL_PORT, keyfile = None, certfile = None):
  217.         self.host = host
  218.         self.port = port
  219.         self.keyfile = keyfile
  220.         self.certfile = certfile
  221.         self.buffer = ''
  222.         msg = 'getaddrinfo returns an empty list'
  223.         self.sock = None
  224.         for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
  225.             (af, socktype, proto, canonname, sa) = res
  226.             
  227.             try:
  228.                 self.sock = socket.socket(af, socktype, proto)
  229.                 self.sock.connect(sa)
  230.             except socket.error:
  231.                 msg = None
  232.                 if self.sock:
  233.                     self.sock.close()
  234.                 
  235.                 self.sock = None
  236.                 continue
  237.  
  238.             break
  239.         
  240.         if not self.sock:
  241.             raise socket.error, msg
  242.         
  243.         self.file = self.sock.makefile('rb')
  244.         self.sslobj = socket.ssl(self.sock, self.keyfile, self.certfile)
  245.         self._debugging = 0
  246.         self.welcome = self._getresp()
  247.  
  248.     
  249.     def _fillBuffer(self):
  250.         localbuf = self.sslobj.read()
  251.         if len(localbuf) == 0:
  252.             raise error_proto('-ERR EOF')
  253.         
  254.         self.buffer += localbuf
  255.  
  256.     
  257.     def _getline(self):
  258.         line = ''
  259.         renewline = re.compile('.*?\\n')
  260.         match = renewline.match(self.buffer)
  261.         while not match:
  262.             self._fillBuffer()
  263.             match = renewline.match(self.buffer)
  264.         line = match.group(0)
  265.         self.buffer = renewline.sub('', self.buffer, 1)
  266.         if self._debugging > 1:
  267.             print '*get*', repr(line)
  268.         
  269.         octets = len(line)
  270.         if line[-2:] == CRLF:
  271.             return (line[:-2], octets)
  272.         
  273.         if line[0] == CR:
  274.             return (line[1:-1], octets)
  275.         
  276.         return (line[:-1], octets)
  277.  
  278.     
  279.     def _putline(self, line):
  280.         if self._debugging > 1:
  281.             print '*put*', repr(line)
  282.         
  283.         line += CRLF
  284.         bytes = len(line)
  285.         while bytes > 0:
  286.             sent = self.sslobj.write(line)
  287.             if sent == bytes:
  288.                 break
  289.             
  290.             line = line[sent:]
  291.             bytes = bytes - sent
  292.  
  293.     
  294.     def quit(self):
  295.         
  296.         try:
  297.             resp = self._shortcmd('QUIT')
  298.         except error_proto:
  299.             val = None
  300.             resp = val
  301.  
  302.         self.sock.close()
  303.         del self.sslobj
  304.         del self.sock
  305.         return resp
  306.  
  307.  
  308. if __name__ == '__main__':
  309.     import sys
  310.     a = POP3(sys.argv[1])
  311.     print a.getwelcome()
  312.     a.user(sys.argv[2])
  313.     a.pass_(sys.argv[3])
  314.     a.list()
  315.     (numMsgs, totalSize) = a.stat()
  316.     for i in range(1, numMsgs + 1):
  317.         (header, msg, octets) = a.retr(i)
  318.         print 'Message %d:' % i
  319.         for line in msg:
  320.             print '   ' + line
  321.         
  322.         print '-----------------------'
  323.     
  324.     a.quit()
  325.  
  326.